Function.prototype.myCall = myCall;
Function.prototype.myApply = myApply;
Function.prototype.myBind = myBind;

// 原函数的thi指向要变成target
function myCall(target, ...props) {
  // 找到 test
  // key 唯一的
  const a = Symbol('fn');
  // this: 指向调用myCall的函数
  target[a] = this;
  // 执行等待被改变this的函数 得到一个返回值 就是原函数的返回值
  let res = target[a](...props);
  // 不影响原来的对象
  delete target[a];
  return res;
}

function myApply(target, arr) {
  if (arr && (!Array.isArray(arr))) {
    // 抛异常
    throw new TypeError('CreateListFromArrayLike called on non-object');
  }
  // 找到 test
  // key 唯一的
  const a = Symbol('fn');
  target[a] = this;
  let res = target[a](arr);
  delete target[a];
  console.log(target);
  return res;
}

function myBind(target, ...args1) {
  // 原函数
  const func = this;

  // 返回值 是什么 function
  // 返回值 参数 this指向也要改变
  // 利用call/apply
  const fn = function (...args2) {
    // this指向 怎么改变
    return func.call(target, [...args1, ...args2])
  };
  fn.prototype = Object.create(func.prototype);
  fn.prototype.constructor = fn;
  return fn
}

